use std::sync::Once;
use std::sync::{Arc, Mutex};

// 定义单例结构体 `Singleton`，包含一个值 `value`。
struct Singleton {
    value: i32,
}

impl Singleton {
    // 静态方法 `instance` 返回一个 `Arc<Mutex<Singleton>>` 实例，确保全局只有一个单例对象。
    fn instance() -> Arc<Mutex<Singleton>> {
        // 使用静态变量和 `Once` 来确保单例只初始化一次。
        static mut SINGLETON: Option<Arc<Mutex<Singleton>>> = None;
        static ONCE: Once = Once::new();

        unsafe {
            ONCE.call_once(|| {
                // 在第一次调用时初始化单例对象。
                let singleton = Singleton { value: 42 };
                SINGLETON = Some(Arc::new(Mutex::new(singleton)));
            });

            // 返回单例对象的克隆，使用 `unwrap` 确保单例已经初始化。
            SINGLETON.clone().unwrap()
        }
    }

    // 获取单例对象的值。
    fn get_value(&self) -> i32 {
        self.value
    }
}

// 主函数入口 `main()`，演示单例模式的使用。
pub fn main() {
    // 获取单例对象。
    let singleton = Singleton::instance();
    // 对单例对象进行加锁，获取内部的值。
    let s = singleton.lock().unwrap();
    // 打印单例对象的值。
    println!("Singleton value: {}", s.get_value());
}
